﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Pacoca
{
    class Anoitecer
    {
        #region Anoitecer e Amanhecer
        float tempoReal;
        Vector2 tempoJogo;
        public static float tempoDoDia = 180f, corNoite;// define quantos minutos vai corresponder 249 horas do jogo
        List<Vector3> corProxima = new List<Vector3>();
        public static Vector3 valorCor, cor;
        
        #endregion

        public Anoitecer()
        {
            #region Anoitecer e Amanhecer
            corProxima.Add(new Vector3(0, 0, 0));// Meia noite
            corProxima.Add(new Vector3(124, 106, 2));// Seis horas da manhã
            corProxima.Add(new Vector3(255, 211, 159));// Meio dia
            corProxima.Add(new Vector3(139, 103, 61));// Seis horas da tarde
            cor = corProxima[1];
            corNoite = 255;
            tempoReal = 6* ((tempoDoDia * 60)/24);
            tempoJogo = new Vector2((int)(tempoReal * (24 / tempoDoDia)) / 60, (int)(tempoReal * (24 / tempoDoDia)) % 60);
            Sol.estadoDeNoite = true;
            #endregion
        }
        public void Update(GameTime gameTime)
        {
            #region Anoitecer e Amanhecer

            if (tempoJogo.X < 24)
            {
                tempoReal += (float)gameTime.ElapsedGameTime.TotalSeconds;
                tempoJogo = new Vector2((int)(tempoReal * (24 / tempoDoDia)) / 60, (int)(tempoReal * (24 / tempoDoDia)) % 60);
            }
            else
            {
                tempoJogo = new Vector2(0, 0);
                tempoReal = 0;
            }
            #region conta cor fundo / tempo

            if (tempoReal < 6 * ((60 * tempoDoDia) / 24) && tempoReal > 0)
            {
                valorCor = new Vector3((corProxima[1].X - corProxima[0].X) / TempoMudancaCor(6),
                                       (corProxima[1].Y - corProxima[0].Y) / TempoMudancaCor(6),
                                       (corProxima[1].Z - corProxima[0].Z) / TempoMudancaCor(6));
                if (tempoReal > 6 * ((60 * tempoDoDia) / 24) - 0.2f)
                    cor = corProxima[1];

            }
            else if (tempoReal < 12 * ((60 * tempoDoDia) / 24) && tempoReal > 6 * ((60 * tempoDoDia) / 24))
            {
                valorCor = new Vector3((corProxima[2].X - corProxima[1].X) / TempoMudancaCor(6),
                                       (corProxima[2].Y - corProxima[1].Y) / TempoMudancaCor(6),
                                       (corProxima[2].Z - corProxima[1].Z) / TempoMudancaCor(6));
                if (tempoReal > 12 * ((60 * tempoDoDia) / 24) - 0.2f)
                    cor = corProxima[2];
            }
            else if (tempoReal < 18 * ((60 * tempoDoDia) / 24) && tempoReal > 12 * ((60 * tempoDoDia) / 24))
            {
                valorCor = new Vector3((corProxima[3].X - corProxima[2].X) / TempoMudancaCor(6),
                                       (corProxima[3].Y - corProxima[2].Y) / TempoMudancaCor(6),
                                       (corProxima[3].Z - corProxima[2].Z) / TempoMudancaCor(6));
                if (tempoReal > 18 * ((60 * tempoDoDia) / 24) - 0.2f)
                    cor = corProxima[3];
            }
            else if (tempoReal < 24 * ((60 * tempoDoDia) / 24) && tempoReal > 18 * ((60 * tempoDoDia) / 24))
            {
                valorCor = new Vector3((corProxima[0].X - corProxima[3].X) / TempoMudancaCor(6),
                                       (corProxima[0].Y - corProxima[3].Y) / TempoMudancaCor(6),
                                       (corProxima[0].Z - corProxima[3].Z) / TempoMudancaCor(6));
                if (tempoReal > 24 * ((60 * tempoDoDia) / 24) - 0.2f)
                    cor = corProxima[0];
            }

            #endregion

            #region conta cor Objetos na Noite / tempo
            float somaCor = 255;
            if (tempoJogo.X >= 18 && tempoJogo.X <= 21)
            {
                if (corNoite > 55)
                {
                    somaCor = (float)(55 - 255) / TempoMudancaCor(3);
                    corNoite += ((float)somaCor * (float)gameTime.ElapsedGameTime.TotalSeconds);
                }

            }
            else if (tempoJogo.X >= 3 && tempoJogo.X < 6)
            {
                if (corNoite < 255)
                {
                    somaCor = (float)(255 - 55) / TempoMudancaCor(3);
                    corNoite += ((float)somaCor * (float)gameTime.ElapsedGameTime.TotalSeconds);
                }
            }
            else if (tempoJogo.X >= 18 || tempoJogo.X < 6)
            {
                corNoite = 55;
            }
            else
                corNoite = 255;

            #endregion


                cor.X += valorCor.X * (float)gameTime.ElapsedGameTime.TotalSeconds;
                cor.Y += valorCor.Y * (float)gameTime.ElapsedGameTime.TotalSeconds;
                cor.Z += valorCor.Z * (float)gameTime.ElapsedGameTime.TotalSeconds;

                if (cor.X <= 0)
                    cor.X = 0;
                else if (cor.X >= 255)
                    cor.X = 255;

                if (cor.Y <= 0)
                    cor.Y = 0;
                else if (cor.Y >= 255)
                    cor.Y = 255;

                if (cor.Z <= 0)
                    cor.Z = 0;
                else if (cor.Z >= 255)
                    cor.Z = 255;

            Game1.corFundo.A = 255;
            Game1.corFundo.B = (byte)cor.X;
            Game1.corFundo.G = (byte)cor.Y;
            Game1.corFundo.R = (byte)cor.Z;


            #endregion
        }

        public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            #region Tempo do Jogo
            spriteBatch.DrawString(Textura.spriteFonte, "Tempo em Segundos: " + (int)tempoReal, new Vector2(50, 10), Color.White);
            spriteBatch.DrawString(Textura.spriteFonte, "Versao 1.0", new Vector2(50, 40), Color.White);
            #region Converter Tempo para String
            string hora, min;
            if (tempoJogo.X < 10)
                hora = "0" + (int)tempoJogo.X;
            else
                hora = "" + (int)tempoJogo.X;
            if (tempoJogo.Y < 10)
                min = "0" + (int)tempoJogo.Y;
            else
                min = "" + (int)tempoJogo.Y;
            #endregion
            spriteBatch.DrawString(Textura.spriteFonte, "Tempo do Jogo: " + hora + "h" + ":" + min + "m", new Vector2(500, 10), Color.White);
            //spriteBatch.DrawString(Textura.spriteFonte, "X: " + (int)cor.X + "    Y: " + (int)cor.Y + "    Z: " + (int)cor.Z, new Vector2(10, 270), Color.White);
            #endregion
        }

        public float TempoMudancaCor(int horas)
        {
            float x = (float)(horas * ((60 * tempoDoDia) / 24));
            return x;
        }

    }
}
